package errdef

import "errors"

func newBizErr(errCode *ErrCode, err error, msg ...string) BizErr {
	bizErr := new(bizErrDefault)
	bizErr.code = errCode.code

	if len(msg) > 0 && len(msg[0]) > 0 {
		bizErr.msg = msg[0]
	} else if err != nil {
		bizErr.msg = err.Error()
	} else {
		bizErr.msg = errCode.defaultErrMsg
	}

	if err != nil {
		bizErr.err = err.Error()
	} else {
		bizErr.err = bizErr.msg
	}

	return bizErr
}

// Convert 转为bizErr, 默认为服务器异常
func Convert(err error) BizErr {
	var bizErr BizErr
	if errors.As(err, &bizErr) {
		return bizErr
	}
	return newBizErr(ServerErr, err, err.Error())
}

func NewErr(code *ErrCode, msg ...string) BizErr {
	return newBizErr(code, nil, msg...)
}

func NewRawErr(code *ErrCode, err error, msg ...string) BizErr {
	return newBizErr(code, err, msg...)
}

// NewBizErr 默认业务异常
func NewBizErr(msg string) BizErr {
	return newBizErr(DefaultBizErr, nil, msg)
}

// NewBizRawErr 默认业务异常
func NewBizRawErr(err error, msg ...string) BizErr {
	return newBizErr(DefaultBizErr, err, msg...)
}

// NewParamErr 参数异常
func NewParamErr(msg string) BizErr {
	return newBizErr(ParamErr, nil, msg)
}

// NewLoginErr 登录异常
func NewLoginErr(msg string) BizErr {
	return newBizErr(LoginErr, nil, msg)
}

// NewAuthErr 权限异常
func NewAuthErr(msg string) BizErr {
	return newBizErr(AuthErr, nil, msg)
}

// NewServerErr 服务器异常
func NewServerErr(msg string) BizErr {
	return newBizErr(ServerErr, nil, msg)
}

// NewServerRawErr 服务器异常
func NewServerRawErr(err error, msg ...string) BizErr {
	return newBizErr(ServerErr, err, msg...)
}

// NewDBErr 数据库异常
func NewDBErr(msg string) BizErr {
	return newBizErr(DBErr, nil, msg)
}

// NewDBRawErr 数据库异常
func NewDBRawErr(err error, msg ...string) BizErr {
	return newBizErr(DBErr, err, msg...)
}
